package com.lsismo.core.base.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
		
/**
 * 泛型DAO接口，包括对POJO常用的CRUD方法
 *
 * <p>如果你的DO需要类型安全的DAO,继承该接口
 *
 * @param <T> 类型变量
 * @param <PK> 类型的主键
 */
public interface GenericDao <T, PK extends Serializable> {
	/**
	 * 由于特殊处理需要，该方法返回hibernate的数据库操作会话类
	 * @return
	 */
	Session getCurrentSession();

    /**
     * 该方法用于获取对象列表，相当于查找表中所有的行。
     * @return 符合条件的对象列表
     */
    List<T> getAll();    

    /**
     * 该方法用于基于ID获取对象，如果找不到符合条件的对象则抛出运行时异常ObjectRetrievalFailureException。
     *
     * @param id 要获取对象的唯一标识符(主键)
     * @return 符合条件的对象
     * @see org.springframework.orm.ObjectRetrievalFailureException
     */
    T get(PK id);
    
    /**
     * 该方法用于通过id参数检查对象是否存在。
     * @param id 实体ID
     * @return - 存在则返回true,不存在则返回false。
     */
    boolean exists(PK id);

    /**
     * 该方法用于保存对象 - 既可用于update也可用于insert操作。
     * @param object 要保存的对象
     * @return 保存后的对象
     */
    T save(T object);

    /**
     * 该方法用于 批量修改 有2种形式的写法
     * @param hql  完整hql
     * @param value 或 hql带(?)-value 形式 
     * @return
     */
    public int bulkUpdate(String hql ,Object ... value);
    
    /**
     * 该方法用于基于id删除对象
     * @param id 要删除对象的唯一标识符(主键)
     */
    void remove(PK id);   
    
    /**
     * 该方法用于基于实例删除对象
     * @param object 要删除对象
     */
    void remove(T object);  
    
    /**
     * 该方法用于批量删除(但不会发生级联删除)
     * @param ids
     * @param idName
     */
    void remove(PK ids , String idName);
    
    /**
     * 该方法用于基于id批量删除对象
     * @param ids 要删除的对象的id数组
     */
    void bulkRemove(final PK[] ids);
    
    /**
     * 该方法用于依据给定的实例查找对象
     * @param object
     * @return 符合条件的对象List
     */
    List<T> findByExample(T object);    
    
    /**
     * 该方法用语依据给定的属性查询
     * @param propertyName
     * @param value
     * @return
     */
    List<T> findByProperty(String propertyName, Object value);
    
    /**
     * 该方法用语按照给定的HQL语句查询
     * @param hql hql语句
     * @param values 数量可变的参数
     * @return
     */
    List<T> find(String hql, Object... values);
  
    /**
     * 该方法获取所有对象列表，对象没有重复.
     * <p>注意，如果要使用该方法，model必须要正确地实现了hashcode和equals两个方法</p>
     * @return 对象列表
     */
    List<T> getAllDistinct();
	
	/**
     * 通过已命名的查询查询
     * @param queryName 已命名的查询的名称
     * @param queryParams 查询名值对
     * @return 找到的结果列表
     */
    List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams) throws Exception;
    /**
     * 分页获取对象列表
     * @param hql 
     * @param first 开始记录数
     * @param max 显示记录数
     * @return
     * @throws Exception
     */
    List<T> findPageAll(final String hql,final int first,final int max) throws Exception;
    /**
     * 分页获取对象列表
     * @param hql
     * @param first
     * @param max
     * @param values
     * @return
     * @throws Exception
     */
    List<T> findPageAll(final String hql,final int first,final int max,Object...values) throws Exception;
    /**
     * 获取对象总记录数
     * @param hqlQuery
     * @return
     * @throws Exception
     */
    int getInfosCount(String hqlQuery)throws Exception;
    /**
     * 获取对象总记录数
     * @param hqlQuery
     * @param values
     * @return
     * @throws Exception
     */
    int getInfosCount(String hqlQuery,Object...values)throws Exception;
    
    Object commonFindById(Class clazz,PK id);

 
}